/*
* ////////////////////////////////////////////////
*
* 开发者：AZPEP
* 友情链接：
*	-	B站：		零分的考卷			https://space.bilibili.com/257391258
*	-	Github：	AZPEP-BiliBili		https://github.com/AZPEP-BiliBili
*	-	Gitee：		AZPEP_BiliBili		https://gitee.com/AZPEP_BiliBili
*
* CopyRight AZPEP
*
* -------------------------------------------------
* 文件名称：LogModule.h
* 描述：日志处理
*/


#pragma once


//////////////////////////////////////////////////////////////
//			   编译库时使用的dll标头定义，请勿改动！
//////////////////////////////////////////////////////////////
#ifdef LOGMODULE_EXPORTS
#define ASTLOG_API __declspec(dllexport)
#else
#define ASTLOG_API __declspec(dllimport)
#endif

//////////////////////////////////////////////////////////////
//							头文件引用
//////////////////////////////////////////////////////////////
#include <string>
#include <Windows.h>

//////////////////////////////////////////////////////////////
//                          枚举定义
//////////////////////////////////////////////////////////////

/// <summary>
/// 日志类型
/// </summary>
typedef enum AstLogType {
	/// <summary>
	/// 日志消息
	/// </summary>
	__LOG_LOG,

	/// <summary>
	/// 调试日志
	/// </summary>
	__L0G_DEBUG,

	/// <summary>
	/// 消息日志
	/// </summary>
	__LOG_MESSAGE,

	/// <summary>
	/// 警告日志
	/// </summary>
	__LOG_WARNING,

	/// <summary>
	/// 错误日志
	/// </summary>
	__LOG_ERROR
};

//////////////////////////////////////////////////////////////
//						    变量定义
//////////////////////////////////////////////////////////////

/// <summary>
/// 日志句柄
/// </summary>
typedef unsigned short ASTLOG_HANDLE;

typedef void (*AstLogCallBackFuncW)(AstLogType, std::wstring);

//////////////////////////////////////////////////////////////
//							常量定义
//////////////////////////////////////////////////////////////
#define AstLog_StartService AstLog_StartServiceW
#define AstLog_WriteMessage AstLog_WriteMessageW
#define AstLog_WriteWarning AstLog_WriteWarningW
#define AstLog_WriteError AstLog_WriteErrorW

#ifdef _TARGET_DEBUG
#define AstLog_WriteDebug AstLog_WriteDebugW
#else
#define AstLog_WriteDebug ;
#endif

//////////////////////////////////////////////////////////////
//						链接库错误代码定义
//////////////////////////////////////////////////////////////
#define ASTLOG_ERROR_SERVICE_STOPPED					20001		//日志服务未启用
#define ASTLOG_ERROR_SERVICE_HANDLE_NOT_FOUND			20002		//日志服务句柄未找到

//////////////////////////////////////////////////////////////
//							函数定义
//////////////////////////////////////////////////////////////

/// <summary>
/// 启动日志服务,有问题不要使！
/// </summary>
/// <param name="Title">日志标题</param>
/// <param name="PrintToConsole">打印日志到控制台，默认开启</param>
/// <returns>成功返回句柄，失败返回0，可用GetLastError()获取错误信息</returns>
EXTERN_C ASTLOG_API ASTLOG_HANDLE AstLog_StartServiceA(
	std::string Title,
	bool PrintToConsole = true
);


/// <summary>
/// 启动日志服务
/// </summary>
/// <param name="Title">日志标题</param>
/// <param name="PrintToConsole">打印日志到控制台，默认开启</param>
/// <param name="CallBackFunction">回传函数，为NULL为不启用</param>
/// <returns>成功返回句柄，失败返回0，可用GetLastError()获取错误信息</returns>
EXTERN_C ASTLOG_API ASTLOG_HANDLE AstLog_StartServiceW(
	std::wstring Title,
	bool PrintToConsole = true,
	AstLogCallBackFuncW CallBackFunction = NULL
);

/// <summary>
/// 启动日志服务，可自由指定日志路径
/// </summary>
/// <param name="Title">日志标题</param>
/// <param name="LogFilePath">日志文件路径</param>
/// <param name="PrintToConsole">打印日志到控制台，默认开启</param>
/// <param name="CallBackFunction">回传函数，为NULL为不启用</param>
/// <returns>成功返回句柄，失败返回0，可用GetLastError()获取错误信息</returns>
EXTERN_C ASTLOG_API ASTLOG_HANDLE AstLog_StartServiceExW(
	std::wstring Title,
	std::wstring LogFilePath,
	bool PrintToConsole = true,
	AstLogCallBackFuncW CallBackFunction = NULL
);

/// <summary>
/// 启动日志服务，可自由指定日志路径
/// </summary>
/// <param name="Title">日志标题</param>
/// <param name="LogFilePath">日志文件路径</param>
/// <param name="PrintToConsole">打印日志到控制台，默认开启</param>
/// <returns>成功返回句柄，失败返回0，可用GetLastError()获取错误信息</returns>
EXTERN_C ASTLOG_API ASTLOG_HANDLE AstLog_StartServiceExA(
	std::string Title,
	std::string LogFilePath,
	bool PrintToConsole = true
);

/// <summary>
/// 查看日志句柄是否可用
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <returns>存在且已启用返回0，存在但未启用返回1，不存在返回-1</returns>
EXTERN_C ASTLOG_API DWORD AstLog_CheckHandleAvaiable(
	ASTLOG_HANDLE Handle
);

/// <summary>
/// 停止日志服务
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_StopService(
	ASTLOG_HANDLE Handle
);


/// <summary>
/// 获取日志文件路径
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <returns>若日志服务未启动，返回“”；若日志服务已启动则返回日志文件路径</returns>
EXTERN_C ASTLOG_API std::wstring AstLog_GetLogFilePath(
	ASTLOG_HANDLE Handle
);

/// <summary>
/// 输出调试日志
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <param name="Message">欲输出的内容</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_WriteDebugW(
	ASTLOG_HANDLE Handle,
	std::wstring Text
);

/// <summary>
/// 输出消息日志
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <param name="Message">欲输出的内容</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_WriteMessageW(
	ASTLOG_HANDLE Handle,
	std::wstring Text
);


/// <summary>
/// 输出警告日志
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <param name="Message">欲输出的内容</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_WriteWarningW(
	ASTLOG_HANDLE Handle,
	std::wstring Text
);

/// <summary>
/// 输出错误日志
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <param name="Message">欲输出的内容</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_WriteErrorW(
	ASTLOG_HANDLE Handle,
	std::wstring Text
);

/// <summary>
/// 输出调试日志
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <param name="Message">欲输出的内容</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_WriteDebugA(
	ASTLOG_HANDLE Handle,
	std::string Text
);

/// <summary>
/// 输出消息日志
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <param name="Message">欲输出的内容</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_WriteMessageA(
	ASTLOG_HANDLE Handle,
	std::string Text
);


/// <summary>
/// 输出警告日志
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <param name="Message">欲输出的内容</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_WriteWarningA(
	ASTLOG_HANDLE Handle,
	std::string Text
);

/// <summary>
/// 输出错误日志
/// </summary>
/// <param name="Handle">日志句柄</param>
/// <param name="Message">欲输出的内容</param>
/// <returns>成功返回true，失败返回false</returns>
EXTERN_C ASTLOG_API bool AstLog_WriteErrorA(
	ASTLOG_HANDLE Handle,
	std::string Text
);